{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "生成模拟订单数据（9个特征）...\n",
      "\n",
      "=== 性能测试 ===\n",
      "测试规模: 100, GM时间: 0.58ms, MK时间: 0.47ms\n",
      "测试规模: 300, GM时间: 1.91ms, MK时间: 1.81ms\n",
      "测试规模: 1000, GM时间: 6.35ms, MK时间: 3.99ms\n",
      "测试规模: 3000, GM时间: 18.83ms, MK时间: 7.89ms\n",
      "测试规模: 5000, GM时间: 18.06ms, MK时间: 19.92ms\n",
      "\n",
      "=== 准确率验证 ===\n",
      "\n",
      "广义映射分类报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "       False       0.71      0.99      0.83      3545\n",
      "        True       0.55      0.03      0.06      1455\n",
      "\n",
      "    accuracy                           0.71      5000\n",
      "   macro avg       0.63      0.51      0.44      5000\n",
      "weighted avg       0.67      0.71      0.60      5000\n",
      "\n",
      "\n",
      "马尔科夫链分类报告:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "       False       0.00      0.00      0.00      3545\n",
      "        True       0.29      1.00      0.45      1455\n",
      "\n",
      "    accuracy                           0.29      5000\n",
      "   macro avg       0.15      0.50      0.23      5000\n",
      "weighted avg       0.08      0.29      0.13      5000\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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CZaZ7WRmH5nZRDObYGZXRcu3NrORZjYp+lurgP2PNbOfzWyymd2QrjhFRERERESKSjprsNYA17r7HkBr4HIzawrcAHzg7rsCH0SP12Fm5YHHgeOApsCZ0b6l0pw5czjrrLNo3Lgx+++/P23atGHIkCGxxdO3b1+uuOIKAHr37s0LL7yw2cds2LAh8+bNS7r8kEMOWWdZ8+bN2WuvvTb7nPnddtttvP/++0VyLHfniCOOYPHixXnLhgwZgpnx008/Fck5khk7dix77703u+yyC1deeSWhT/26+vfvT/PmzfNu5cqV47vvvgPg5ptvZqeddqJGjRrr7PPYY4/x/PPPpy1uEREREQnSlmC5+2x3/ya6vwSYCNQF2gP9os36AScn2b0VMNndp7j7KmBQtF/a9e8PDRtCuXLhb//+m3c8d+fkk0/m0EMPZcqUKYwdO5ZBgwYxc+bMogi3QGvWrElpu27dunHuueemNZYlS5YwY8YMgLSOyHfHHXdw1FFHFcmxRowYQbNmzdhiiy3ylg0cOJCDDz6YQYMGFck5krn00kvp06cPkyZNYtKkSbzzzjvrbdO5c2e+++47vvvuO1588UUaNmxI8+bNAWjXrh2jR49eb58LL7yQRx55JG1xi6xjhx3ADMzIOvzwvPvssEPckYmIiKRdsfTBMrOGwL7AV0Dt3IkZo7/bJ9mlLjAj4fHMaFla9e8PXbvCtGngHv527bp5SdaHH35IpUqV6NatW96yBg0a0L17dwDWrl3Lv//9b1q2bMk+++zDU089BUB2djZZWVmcdtpp7L777nTu3DmvNmPs2LEcdthh7L///hxzzDHMnh3muczKyuKmm27isMMO4+GHH+aNN97ggAMOYN999+Woo45izpw568XXs2dPevXqxezZs9epFSlfvjzTpk3jzz//5NRTT6Vly5a0bNmSzz77DID58+fTtm1b9t13Xy655JKkNS25Tj/9dF5++WUgJClnnvnPSMhTp07lkEMOYb/99mO//fbj888/z3v+hx56KKeccgpNmzalW7du5OTkAFCjRg2uvfZa9ttvP4488kj+/PNPAM4//3xeffVVINSc3X777ey3337svffeebVOf/75J0cffTT77bcfl1xyCQ0aNEha89a/f3/at/8np1+6dCmfffYZzz777DoJ1tq1a+nRowd77703++yzD48++igAY8aM4cADD6RZs2a0atWKJUuWFFg+uWbPns3ixYtp06YNZsa5557L0KFDC90nf3m2bt2aOnXqrLddtWrVaNiwYdLkS6TIJfmsKXS5iIhIGZL2YdrNrAbwGnC1uy9OsVN9so2SfoM3s65AV4DatWuTnZ29zvott9wy78vt9ddX5ocfyuFeFbP1a3jGjCnPypXrnnr5cujSxende23SQPfeO4d7711Z4BMZO3Yse+21V4FfsJ9//nmqVKnChx9+yMqVK2nbti0HHnggy5cv59tvv+Wrr76iTp06HH300YwcOZIWLVpw2WWXMWjQILbddltee+01rrvuOp544gnWrl3L3LlzefPNNwFYuHAhI0eOxMzo168fd911F//9739ZsWIFq1atYsmSJaxcuZKKFSuy/fbb88knnwDQp08fPvvsM7beemsuvPBCLrnkEtq0acOMGTM45ZRT+Prrr7n55ptp2bIlN9xwA++88w59+vRh6dKlVK5ceZ3n5+4ce+yxXHrppVxyySUMGzaMZ555hn79+rFkyRKqVq3K66+/TpUqVZg8eTJdunTh448/Zvny5YwePZrRo0dTv359OnToQP/+/Tn55JNZtmwZe+yxBz179uSee+7h5ptv5v7772f16tX8/fffLFmyBHenRo0afPzxxzz99NP83//9H4899hg333wzBx10ENdeey0jR44sMO5PP/2UXr16sXbtWpYsWcKgQYM48sgjqVOnDltuuSWffPIJzZs355lnnmHSpEmMGjWKChUqsGDBAubPn8/pp5/O888/z/7778/ixYtZs2YN33zzDeeff37S18Fbb73FlClTqFOnTt5rZeutt2batGmFJmcDBw5k0KBBSbfJv2zvvffm/fffZ4899lhn+YoVK9Z732zI0qVLN3qfsk5l8o+sQtapjEREpKxLa4JlZhUJyVV/d389WjzHzOq4+2wzqwPMTbLrTGCnhMf1gFnJzuHufYA+AC1atPCsrKx11k+cODFvHqNKlaB8eVi7dg3ly6//1FcWkCetXGlJt889Zs2alZLvSJjItVKlSnkxXH755Xz66adUqlSJMWPGMGrUKMaNG8cbb7wBwKJFi5g9ezbVqlWjVatW7L777gDsv//+zJ07l1mzZjFx4kROOeUUINSg1KlTh5o1a1K+fHnOOeecvHNNnTqViy66iNmzZ7Nq1SoaNWpEzZo114mpcuXKVK5cmfLly1OzZk0+++wzXnrpJT755JO8BGXSpEl5z2fp0qUAfPnll7z++uvUrFmTjh07UqtWLWrUqLHenFFmRv369dl2221566232HPPPdluu+0oV64cNWvWJCcnhyuuuILvvvuO8uXL88svv1CzZs2857/PPvsAcPbZZzN27FjOOeccypUrx/nnn0+FChXo0qULHTp0oGbNmlSsWJGqVatSs2ZNzIyzzjqLmjVrctBBBzFixAhq1qzJ6NGjGTJkCDVr1qRDhw4Fxr1w4UJ23HHHvHmwhg4dytVXX03NmjXp3Lkzw4cP55BDDuHTTz/liiuuoFatMFZLzZo1+eGHH9hxxx3JfS3mHrtWrVqMGzeuwNfKH3/8kfd/gFDrVLFixQLn4frqq6+oUaMGBxxwQNL1+ffbaaed+Omnn9ZbXqVKFfbdd98C40omt4ZV/qEySY3KSEREyrq0JVgWqqqeBSa6+wMJq4YD5wH3RH+HJdl9DLCrmTUCfgfOAM7a3Jgeeij8XbLk76RfWhs2DM0C82vQADb1R9c999yT1157Le/x448/zrx582jRogUQangeffRRjjnmmHX2y87OXqdWpXz58qxZswZ3Z8899+SLL75Ier7q1avn3e/evTv/+te/OOmkk8jOzqZnz56Fxjp79my6dOnC8OHD8wZJyMnJ4YsvvqBq1arrbb8xQ3x36tSJyy+/nL59+66z/MEHH6R27dp8//335OTkUKVKlQKPX9D5ClqeW365ZQcU2pQxUYUKFfKaJM6fP58PP/yQ8ePHY2asXbsWM+O+++7D3dc7f7JlAD///DOdOnVKer7s7Gzq1au3Tt+8mTNnsuOOOxYY46BBg9ZpHrghK1asSPp/FBEREZGik84+WAcB5wBHmNl30e14QmJ1tJlNAo6OHmNmO5rZCAB3XwNcAbxLGBxjsLtPSGOsANx9N1Srtu6yatXC8k11xBFHsGLFCp588sm8ZcuXL8+7f8wxx/Dkk0+yevVqAH755ReWLVtW4PGaNGnCn3/+mZdgrV69mgkTkhfNokWLqFs3dF3r169f0m1yrV69mtNPP517772X3XbbLW9527Zteeyxx/Ie545Wd+ihh9I/6pz29ttvs3DhwkKPf8opp3Ddddetl0guWrSIOnXqUK5cOV588UXWrv2nKebo0aP57bffyMnJ4eWXX+bggw8GQtKX29dqwIABectTcfDBBzN48GAA3nvvvQLjbtKkCVOmTAHg1Vdf5dxzz2XatGlMnTqVGTNm0KhRIz799FPatm1L79698xK4BQsWsPvuuzNr1izGjBkDhKZ6a9asoUmTJnmDU+S/bbXVVnk1kV9++SXuzgsvvLBOP7BEOTk5vPLKK5xxxhkpP/dffvklLaM3iqxjA/0GRUREyrp0jiL4qbubu+/j7s2j2wh3n+/uR7r7rtHfBdH2s9z9+IT9R7j7bu6+s7tvRoqTus6doU+fUGNlFv726ROWbyozY+jQoXz88cc0atSIVq1acd5553HvvfcCcNFFF9G0aVP2228/9tprLy655JJCRwCsVKkSr776Ktdffz3NmjWjefPmeQND5NezZ086duzIIYccwrbbbltonF999RVjxozh9ttvzxvoYtasWTzyyCN8/fXX7LPPPjRt2pTevXsDcPvttzNq1Cj2228/3nvvPerXr1/o8WvWrMn1119PpUrrNqe87LLL6NevH61bt+aXX35ZpwauTZs23HDDDey11140atQor1lk9erVmTBhAvvvvz8ffvght912W6HnTnT77bfz3nvvsd9++/H222/nJTX5nXDCCXl9RQYOHJh37lynnnoqAwYM4KKLLqJ+/frss88+NGvWjAEDBlCpUiVefvllunfvTrNmzTj66KNZsWJFSvE9+eSTXHTRReyyyy7svPPOHHfccQAMHz58nec5atQo6tWrR+PGjdfZ/7rrrqNevXosX76cevXqrVNr+dlnnxXZKIsiSY0dGz4wK1ZMvr527eKNR0REJAaWapOp0qBFixb+9ddfr7Ns4sSJ63Xqz+1XI/8oaWWSnZ1Nr1698gbsSFSjRo28vmAba+XKlZQvX54KFSrwxRdfcOmll+bVyiWaPXs25557bl4/s9Lu22+/5YEHHuDFF19cb12y98iGqL/R+jK+TNyhVSuYOxdGj85LpoqiXMxsrLu3KIIoY5Hs2iTplfHvR8lIet0Xv4KuT2kfRVCkJJk+fTqnn346OTk5VKpUiaeffjrpdnXq1OHiiy9m8eLFZSLBmjdvHnfeeWfcYUhZZgZDhsDixaqpEhGRjKYES0qkrKysAn+F2dTaK4Bdd92Vb7/9NqVtTz/99JTmryoNjj766LhDkLJq7Vro1w/OOw/q1Ys7GhERkdgVy0TDIiJSRvXoAV26wNtvxx2JiIhIiaAES0RENs2TT4b5L666Ck48Me5oRERESgQlWCIisvHefRe6d4cTToD77487GhERkRJDCZaIiGyc5cvh3HNhzz1h4EAoXz7uiEREREoMDXIhIiIbp1o1GDYM6taFMjDKpoiISFFSDVaiHXYIQw3nv+2ww2Yd1sw455xz8h6vWbOG7bbbjhM3ss9Cdnb2Ru+zIatXr+aGG26gefPm7LXXXrRq1Yq3o87qNWrU2KhjDR8+nHvuuWej9vn777857LDDWLt2bd6yBx98kCpVqrBo0aKNOtbGeOedd2jSpAm77LJLgTH379+fNm3asM8++3DggQfy/fff5617+OGH2Wuvvdhzzz156KGH8pb36NGDDz/8MG1xx61/f2jYEI444jAaNgyPJYP8/TcMHx7ut24NO+0UbzwiIiIlkBKsRHPmbNzyFFWvXp3x48fz999/AzBy5Ejq1q27UcdYs2bNZsVQkFtvvZXZs2fz1VdfMX78eN54441NHpr8pJNO4oYbbtiofZ577jk6dOhA+YQmRgMHDqRly5YMGTJkk+LYkLVr13L55Zfz9ttv8+OPPzJw4EB+/PHH9bZr1KgRI0aMYNy4cdx666107doVgPHjx/P0008zevRovv/+e958800mTZoEQPfu3Tc6ySwt+veHrl1h2jRwN6ZNC4+VZGWInJwwFPvJJ8PEiXFHIyIiUmJlXoKVlUXV44+HrKx/bk88kdq+8+atu99GzJZ93HHH8dZbbwEhgTjzzDPz1o0ePZoDDzyQfffdlwMPPJCff/4ZgL59+9KxY0fatWtH27Zt1znemDFj2HfffZkyZQoffPAB++67L3vvvTcXXnghK1eu5O233+b000/P2z47O5t27dqtc4zly5fz9NNP8+ijj1K5cmUAateuvc5+N998M82aNaN169bMiRLNN954gwMOOIB9992Xo446Km953759ueKKKwA4//zzufLKKznwwANp3Lgxr776atJy6d+/P+3bt897/Ouvv7J06VLuuusuBg4cmLd86dKlXHDBBey9997ss88+vPbaa0Coidpvv/1o1qwZRx555Ab/D7nlvcsuu9C4cWMqVarEGWecwbBhw9bb7sADD6RWrVoAtG7dmpkzZwIwceJEWrduTbVq1ahQoQKHHXZYXjLYoEED5s+fzx9//JFSLKXJzTeHrjeJcrvi7L47HHwwtG8PF14I//433HMPPPNMmHt21CiYMAH++ANWr44nftlMt90Gr7wC994Le+wRdzQiIiIllvpgFZMzzjiDO+64gxNPPJFx48Zx4YUX8sknnwCw++67M2rUKCpUqMD777/PTTfdlJdAfPHFF4wbN46tt96a7OxsAD7//HO6d+/OsGHD2H777TnssMP44IMP2G233Tj33HN58sknueKKK7jkkktYtmwZ1atX5+WXX6ZTp07rxDR58mTq16/PFltskbTWatmyZbRu3Zq7776b6667jqeffppbbrmFgw8+mC+//BIz45lnnuG+++7j/iSjiM2ePZtPP/2Un376iZNOOonTTjttnfWrVq1iypQpNGzYMG9ZbvJ5yCGH8PPPPzN37ly233577rzzTrbcckt++OEHABYuXMiff/7JxRdfzKhRo2jUqBELFiwA4KOPPuKaa65ZL55q1arx+eef8/vvv7NTQtOmevXq8dVXXxX6/3v22Wc57rjjANhrr724+eabmT9/PlWrVmXEiBG0aNEib9v99tuPzz77jFNPPbXQY5Y206cnX56TA/vsA/Pnh9qtb74Jv0WsWFHwsbbYArbZ5p/bttuu+zjZsmrVQotdicELL8Ddd8NFF4V5r0RERKRAmZdgZWfz95Il1NyUjtnbbgtRkrOx9tlnH6ZOncrAgQM5/vjj11m3aNEizjvvPCZNmoSZsTrhJ/6jjz6arbfeOu/xxIkT6dq1K++99x477rgj33//PY0aNWK33XYD4LzzzuPxxx/n6quv5thjj+WNN97gtNNO46233uK+++7bqJgrVaqU1+dr//33Z+TIkQDMnDmTTp06MXv2bFatWkWjRo2S7n/yySdTrlw5mjZtmlfLlWjevHlstdVW6ywbNGgQQ4YMoVy5cnTo0IFXXnmFyy+/nPfff59BgwblbVerVi3eeOMNDj300Lzz55bT4YcfznfffVfg83L39ZZZId/cP/roI5599lk+/fRTAPbYYw+uv/56jj76aGrUqEGzZs2oUOGft9L222/PrFmzCjxeafT331CxIqxatf66Bg1g8OD1ly9fHpKu3Nu8ees+Tlw2aVL4W1i3u8qVU0vEEpdtuSWUy7x6+qI1bRpcfDEccUSo7VeWKyIiUqjMS7BidNJJJ9GjRw+ys7OZP39+3vJbb72Vww8/nCFDhjB16lSyEpoeVq9efZ1j1KlThxUrVvDtt9+y4447Jk0WcnXq1InHH3+crbfempYtW66XVO6yyy5Mnz69wD5XFStWzEs8ypcvn9cPrHv37vzrX//ipJNOIjs7m549eybdP7fZISRPaqpWrcqKhGqOcePGMWnSJI4++mgg1HA1btyYyy+/HHdfLwlKtgw2XINVr149ZsyYkbd85syZ7Ljjjkmfw/jx47nooot4++232WabbfKWd+nShS5dugBw0003Ua9evbx1K1asoGrVqkmPVxq5h4qLVatCkrNy5T/rqlULFRvJVKsWbhszDsLq1bBgQcGJWOJt/Pjwd8ECSBgjZR3lysHWW6deS5Z7q1gx9ZjLvAYN4KWX4KijVDAiIiIpUIKVqHbt5ANa1K5dJIe/8MIL2XLLLdl7773zmvtBqMHKHfSib9++hR5jq6224tlnn6Vt27ZUr16d1q1bM3XqVCZPnswuu+zCiy++yGGHHQZAVlYWXbp04emnn16veSCEhKNLly5ceeWV9OrVCwjN+j744APOPvvsAmNIjLdfv34bUwTrqFWrFmvXrmXFihVUqVKFgQMH0rNnT2688ca8bRo1asS0adNo27Ytjz32WN6IfQsXLqRNmzZcfvnl/Pbbb3lNBLfeeusN1mC1bNmSSZMm8dtvv1G3bl0GDRrEgAED1ttu+vTpdO7cmZdeeimvhjBXbtPF6dOn8/rrr/PFF1/krfvll1/o2LHjJpdLSXPffTBgAPz3v1C/fuiLNX26U7++cffd0Llz0Z2rYsXwdtuYt1xODixenFpN2aY2YUwlQSvkt47SacEC+PVXaNkSytDrWUREJN2UYCVK88AE9erV46qrrlpv+XXXXcd5553HAw88wBFHHLHB49SuXZs33niD4447jueee47nn3+ejh07smbNGlq2bEm3bt2AUOt04okn0rdv3wITobvuuotbbrmFli1bUq1aNapXr84dd9xR6Pl79uxJx44dqVu3Lq1bt+a3335L4dkn17ZtWz799FOOOuooBg0alDdEfK5TTjmFQYMGccstt3D55Zez1157Ub58eW6//XY6dOhAnz596NChAzk5OWy//fZ5zRgLU6FCBR577DGOOeYY1q5dy4UXXsiee+4JQO/evQHo1q0bd9xxBwsXLuSyyy7L2+/rr78G4NRTT2X+/PlUrFiRxx9/PG8w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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== 规则分析示例 ===\n",
      "订单ID: 0\n",
      "商品数: 7, 金额: 798.58, 用户等级: bronze\n",
      "用户年龄: 25, 购买频率: 6.03, 退货率: 0.08\n",
      "设备类型: mobile, 位置风险: 0.06, IP风险: 0.87\n",
      "规则评估结果:\n",
      "- High Item Count: 未触发\n",
      "- Low Order Value: 未触发\n",
      "- Bronze User: 触发\n",
      "- Young User: 未触发\n",
      "- High Purchase Freq: 未触发\n",
      "- High Return Rate: 未触发\n",
      "- Mobile Device: 触发\n",
      "- High Location Risk: 未触发\n",
      "- High IP Risk: 触发\n",
      "风险评分: 0.21, 最终判定: 低风险\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import timeit\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import accuracy_score, classification_report\n",
    "import pandas as pd\n",
    "import random\n",
    "\n",
    "# ================== 数据生成 ==================\n",
    "def generate_orders(num_orders=5000):\n",
    "    \"\"\"生成模拟电商订单数据（9个特征）\"\"\"\n",
    "    np.random.seed(42)\n",
    "    orders = []\n",
    "    for i in range(num_orders):\n",
    "        items = np.random.randint(1, 20)  # 商品数1-20\n",
    "        value = np.random.uniform(10, 1000)  # 订单金额10-1000\n",
    "        user_level = np.random.choice(['bronze', 'silver', 'gold'], p=[0.6, 0.3, 0.1])\n",
    "        user_age = np.random.randint(18, 70)  # 用户年龄\n",
    "        purchase_freq = np.random.uniform(0.1, 10.0)  # 月购买频率\n",
    "        return_rate = np.random.uniform(0, 0.5)  # 历史退货率\n",
    "        device_type = np.random.choice(['mobile', 'desktop', 'tablet'], p=[0.7, 0.25, 0.05])\n",
    "        location_risk = np.random.uniform(0, 1)  # 地理位置风险\n",
    "        ip_risk = np.random.uniform(0, 1)  # IP风险评分\n",
    "        \n",
    "        # 更复杂的欺诈规则\n",
    "        fraud_prob = (\n",
    "            0.05 + \n",
    "            0.15 * (items > 15) + \n",
    "            0.10 * (value < 100) + \n",
    "            0.08 * (user_level == 'bronze') +\n",
    "            0.05 * (user_age < 25) +\n",
    "            0.07 * (purchase_freq > 8) +\n",
    "            0.12 * (return_rate > 0.3) +\n",
    "            0.05 * (device_type == 'mobile') +\n",
    "            0.10 * (location_risk > 0.7) +\n",
    "            0.08 * (ip_risk > 0.8)\n",
    "        )\n",
    "        is_fraud = np.random.random() < fraud_prob\n",
    "        \n",
    "        orders.append({\n",
    "            'order_id': i,\n",
    "            'items': items,\n",
    "            'value': value,\n",
    "            'user_level': user_level,\n",
    "            'user_age': user_age,\n",
    "            'purchase_freq': purchase_freq,\n",
    "            'return_rate': return_rate,\n",
    "            'device_type': device_type,\n",
    "            'location_risk': location_risk,\n",
    "            'ip_risk': ip_risk,\n",
    "            'is_fraud': is_fraud  # 真实标签\n",
    "        })\n",
    "    return orders\n",
    "\n",
    "# ================== 广义映射实现（9特征） ==================\n",
    "class RiskRule:\n",
    "    \"\"\"风险规则基类\"\"\"\n",
    "    def __init__(self, name, weight):\n",
    "        self.name = name\n",
    "        self.weight = weight\n",
    "    \n",
    "    def evaluate(self, order) -> bool:\n",
    "        \"\"\"评估规则（子类实现）\"\"\"\n",
    "        raise NotImplementedError\n",
    "\n",
    "class QuantityRule(RiskRule):\n",
    "    \"\"\"商品数量规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['items'] > 15\n",
    "\n",
    "class ValueRule(RiskRule):\n",
    "    \"\"\"订单金额规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['value'] < 100\n",
    "\n",
    "class UserLevelRule(RiskRule):\n",
    "    \"\"\"用户等级规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['user_level'] == 'bronze'\n",
    "\n",
    "class UserAgeRule(RiskRule):\n",
    "    \"\"\"用户年龄规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['user_age'] < 25\n",
    "\n",
    "class PurchaseFreqRule(RiskRule):\n",
    "    \"\"\"购买频率规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['purchase_freq'] > 8\n",
    "\n",
    "class ReturnRateRule(RiskRule):\n",
    "    \"\"\"退货率规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['return_rate'] > 0.3\n",
    "\n",
    "class DeviceRule(RiskRule):\n",
    "    \"\"\"设备类型规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['device_type'] == 'mobile'\n",
    "\n",
    "class LocationRiskRule(RiskRule):\n",
    "    \"\"\"地理位置风险规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['location_risk'] > 0.7\n",
    "\n",
    "class IPRiskRule(RiskRule):\n",
    "    \"\"\"IP风险规则\"\"\"\n",
    "    def evaluate(self, order):\n",
    "        return order['ip_risk'] > 0.8\n",
    "\n",
    "class RiskSystem:\n",
    "    \"\"\"广义映射风控系统（9规则）\"\"\"\n",
    "    def __init__(self):\n",
    "        self.rules = [\n",
    "            QuantityRule('High Item Count', 0.15),\n",
    "            ValueRule('Low Order Value', 0.10),\n",
    "            UserLevelRule('Bronze User', 0.08),\n",
    "            UserAgeRule('Young User', 0.05),\n",
    "            PurchaseFreqRule('High Purchase Freq', 0.07),\n",
    "            ReturnRateRule('High Return Rate', 0.12),\n",
    "            DeviceRule('Mobile Device', 0.05),\n",
    "            LocationRiskRule('High Location Risk', 0.10),\n",
    "            IPRiskRule('High IP Risk', 0.08)\n",
    "        ]\n",
    "        self.threshold = 0.5  # 风险阈值\n",
    "    \n",
    "    def process(self, order):\n",
    "        \"\"\"处理订单\"\"\"\n",
    "        risk_score = 0\n",
    "        rule_results = {}\n",
    "        \n",
    "        for rule in self.rules:\n",
    "            result = rule.evaluate(order)\n",
    "            if result:\n",
    "                risk_score += rule.weight\n",
    "            rule_results[rule.name] = result\n",
    "        \n",
    "        is_risk = risk_score > self.threshold\n",
    "        return is_risk, risk_score, rule_results\n",
    "\n",
    "# ================== 马尔科夫链实现（9特征） ==================\n",
    "def mk_process(orders):\n",
    "    \"\"\"马尔科夫链风控系统（扩展特征）\"\"\"\n",
    "    results = []\n",
    "    # 定义状态转移规则\n",
    "    transition = {\n",
    "        'start': [('check_quantity', 1.0)],\n",
    "        'check_quantity': [\n",
    "            ('check_value', 0.7),\n",
    "            ('high_risk', 0.3)\n",
    "        ],\n",
    "        'check_value': [\n",
    "            ('check_user_level', 0.6),\n",
    "            ('high_risk', 0.4)\n",
    "        ],\n",
    "        'check_user_level': [\n",
    "            ('check_user_age', 0.5),\n",
    "            ('high_risk', 0.5)\n",
    "        ],\n",
    "        'check_user_age': [\n",
    "            ('check_purchase_freq', 0.6),\n",
    "            ('high_risk', 0.4)\n",
    "        ],\n",
    "        'check_purchase_freq': [\n",
    "            ('check_return_rate', 0.7),\n",
    "            ('high_risk', 0.3)\n",
    "        ],\n",
    "        'check_return_rate': [\n",
    "            ('check_device', 0.6),\n",
    "            ('high_risk', 0.4)\n",
    "        ],\n",
    "        'check_device': [\n",
    "            ('check_location', 0.7),\n",
    "            ('high_risk', 0.3)\n",
    "        ],\n",
    "        'check_location': [\n",
    "            ('check_ip', 0.6),\n",
    "            ('high_risk', 0.4)\n",
    "        ],\n",
    "        'check_ip': [\n",
    "            ('low_risk', 0.8),\n",
    "            ('high_risk', 0.2)\n",
    "        ]\n",
    "    }\n",
    "    \n",
    "    for order in orders:\n",
    "        state = 'start'\n",
    "        while state not in ['low_risk', 'high_risk']:\n",
    "            # 根据订单特征调整转移概率\n",
    "            if state == 'check_quantity' and order['items'] > 15:\n",
    "                transition['check_quantity'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_value' and order['value'] < 100:\n",
    "                transition['check_value'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_user_level' and order['user_level'] == 'bronze':\n",
    "                transition['check_user_level'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_user_age' and order['user_age'] < 25:\n",
    "                transition['check_user_age'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_purchase_freq' and order['purchase_freq'] > 8:\n",
    "                transition['check_purchase_freq'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_return_rate' and order['return_rate'] > 0.3:\n",
    "                transition['check_return_rate'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_device' and order['device_type'] == 'mobile':\n",
    "                transition['check_device'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_location' and order['location_risk'] > 0.7:\n",
    "                transition['check_location'] = [('high_risk', 1.0)]\n",
    "            elif state == 'check_ip' and order['ip_risk'] > 0.8:\n",
    "                transition['check_ip'] = [('high_risk', 1.0)]\n",
    "            \n",
    "            # 状态转移\n",
    "            rand_val = np.random.random()\n",
    "            cumulative = 0.0\n",
    "            for next_state, prob in transition[state]:\n",
    "                cumulative += prob\n",
    "                if rand_val <= cumulative:\n",
    "                    state = next_state\n",
    "                    break\n",
    "        \n",
    "        results.append(state == 'high_risk')\n",
    "    return np.array(results)\n",
    "\n",
    "# ================== 性能测试 ==================\n",
    "def performance_test(orders):\n",
    "    \"\"\"时间复杂度对比测试\"\"\"\n",
    "    sizes = [100, 300, 1000, 3000, 5000]\n",
    "    gm_times, mk_times = [], []\n",
    "    \n",
    "    # 初始化系统\n",
    "    gm_system = RiskSystem()\n",
    "    \n",
    "    for n in sizes:\n",
    "        if n > len(orders):\n",
    "            continue\n",
    "            \n",
    "        subset = orders[:n]\n",
    "        \n",
    "        # 广义映射测试\n",
    "        gm_start = timeit.default_timer()\n",
    "        for order in subset:\n",
    "            gm_system.process(order)\n",
    "        gm_time = (timeit.default_timer() - gm_start) * 1000  # 毫秒\n",
    "        gm_times.append(gm_time)\n",
    "        \n",
    "        # 马尔科夫链测试\n",
    "        mk_start = timeit.default_timer()\n",
    "        mk_process(subset)\n",
    "        mk_time = (timeit.default_timer() - mk_start) * 1000\n",
    "        mk_times.append(mk_time)\n",
    "        \n",
    "        print(f\"测试规模: {n}, GM时间: {gm_time:.2f}ms, MK时间: {mk_time:.2f}ms\")\n",
    "    \n",
    "    return sizes[:len(gm_times)], gm_times, mk_times\n",
    "\n",
    "# ================== 可视化 ==================\n",
    "def plot_results(sizes, gm_times, mk_times, gm_acc, mk_acc):\n",
    "    plt.figure(figsize=(12, 5))\n",
    "    \n",
    "    # 耗时对比\n",
    "    plt.subplot(1, 2, 1)\n",
    "    plt.plot(sizes, gm_times, 'b-o', label=f'Generalized Mapping (Acc={gm_acc:.2f})')\n",
    "    plt.plot(sizes, mk_times, 'r--s', label=f'Markov Chain (Acc={mk_acc:.2f})')\n",
    "    plt.xlabel('Number of Orders')\n",
    "    plt.ylabel('Processing Time (ms)')\n",
    "    plt.title('Time Complexity Comparison (9 Features)')\n",
    "    plt.grid(True)\n",
    "    plt.legend()\n",
    "    \n",
    "    # 准确率对比\n",
    "    plt.subplot(1, 2, 2)\n",
    "    plt.bar(['Generalized Mapping', 'Markov Chain'], [gm_acc, mk_acc], color=['blue', 'red'])\n",
    "    plt.ylim(0, 1)\n",
    "    plt.ylabel('Accuracy')\n",
    "    plt.title('Risk Detection Accuracy (9 Features)')\n",
    "    plt.grid(True)\n",
    "    \n",
    "    plt.tight_layout()\n",
    "    plt.savefig('ecommerce_9features_performance.png', dpi=300)\n",
    "    plt.show()\n",
    "\n",
    "# ================== 主程序 ==================\n",
    "if __name__ == \"__main__\":\n",
    "    print(\"生成模拟订单数据（9个特征）...\")\n",
    "    orders = generate_orders(5000)  # 生成5000笔订单\n",
    "    y_true = np.array([o['is_fraud'] for o in orders])\n",
    "    \n",
    "    print(\"\\n=== 性能测试 ===\")\n",
    "    sizes, gm_times, mk_times = performance_test(orders)\n",
    "    \n",
    "    print(\"\\n=== 准确率验证 ===\")\n",
    "    # 广义映射处理\n",
    "    gm_system = RiskSystem()\n",
    "    y_pred_gm = []\n",
    "    for order in orders:\n",
    "        is_risk, _, _ = gm_system.process(order)\n",
    "        y_pred_gm.append(is_risk)\n",
    "    y_pred_gm = np.array(y_pred_gm)\n",
    "    \n",
    "    # 马尔科夫链处理\n",
    "    y_pred_mk = mk_process(orders)\n",
    "    \n",
    "    # 计算准确率\n",
    "    gm_acc = accuracy_score(y_true, y_pred_gm)\n",
    "    mk_acc = accuracy_score(y_true, y_pred_mk)\n",
    "    \n",
    "    print(\"\\n广义映射分类报告:\")\n",
    "    print(classification_report(y_true, y_pred_gm))\n",
    "    \n",
    "    print(\"\\n马尔科夫链分类报告:\")\n",
    "    print(classification_report(y_true, y_pred_mk))\n",
    "    \n",
    "    # 可视化结果\n",
    "    plot_results(sizes, gm_times, mk_times, gm_acc, mk_acc)\n",
    "    \n",
    "    # 输出规则分析示例\n",
    "    print(\"\\n=== 规则分析示例 ===\")\n",
    "    sample_order = orders[0]\n",
    "    is_risk, risk_score, rule_results = gm_system.process(sample_order)\n",
    "    print(f\"订单ID: {sample_order['order_id']}\")\n",
    "    print(f\"商品数: {sample_order['items']}, 金额: {sample_order['value']:.2f}, 用户等级: {sample_order['user_level']}\")\n",
    "    print(f\"用户年龄: {sample_order['user_age']}, 购买频率: {sample_order['purchase_freq']:.2f}, 退货率: {sample_order['return_rate']:.2f}\")\n",
    "    print(f\"设备类型: {sample_order['device_type']}, 位置风险: {sample_order['location_risk']:.2f}, IP风险: {sample_order['ip_risk']:.2f}\")\n",
    "    print(\"规则评估结果:\")\n",
    "    for rule, result in rule_results.items():\n",
    "        print(f\"- {rule}: {'触发' if result else '未触发'}\")\n",
    "    print(f\"风险评分: {risk_score:.2f}, 最终判定: {'高风险' if is_risk else '低风险'}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
